# PCA 数据降维
# 把IRIS数据集 4维->2维

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import numpy as np

x, y = load_iris(return_X_y=True)  # 加载数据，x表示数据集中的属性数据，y表示数据标签
pca = PCA(n_components=4)          # 加载pca算法，可以直接设置降维后主成分数目为2，这里设置4维，为了显示方差
pca.fit(x)
reduced_x = pca.transform(x)       # 降维后的2维数据

# 画出2维投影图###########
plt.scatter(reduced_x[:, 0], reduced_x[:, 1], c=y)

# color = ['r', 'g', 'b']
# marker = ['x', 's', '.']
# for label in range(3):
#     ins = y == label
#     data = reduced_x[ins, :]
#     plt.scatter(data[:, 0], data[:, 1], c=color[label], marker=marker[label])


# 画出方差累计###########
fig = plt.figure()
n_components = pca.n_components
csum = np.cumsum(pca.explained_variance_ratio_)
# plt.plot(range(1, n_components+1), csum)
# plt.xlabel('主成分')
# plt.ylabel('方差')
fig = plt.figure()
ax1 = fig.add_subplot()
# plot1 = ax1.plot(range(1, n_components+1), pca.explained_variance_ratio_, '-bo', label='单个方差')
plot1 = ax1.bar(range(1, n_components+1), pca.explained_variance_ratio_, fc='b', label='单个方差')

ax2 = ax1.twinx()
plot2 = ax2.plot(range(1, n_components+1), csum, '-ro', label='累计方差')

for tl in ax1.get_yticklabels():
    tl.set_color('b')
for tl in ax2.get_yticklabels():
    tl.set_color('r')


ax1.set_xlabel('主成分')
ax1.set_ylabel('方差')

# lines = plot1 + plot2   # 要两个plot一样才能给出label
# ax1.legend(lines, [l.get_label() for l in lines])


###########
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负
plt.show()
print('done')

